from timeit import Timer
from Primes import Divisors

import sys
import math


def Problem():
    """
    A perfect number is a number for which the sum of its proper divisors is 
    exactly equal to the number. For example, the sum of the proper divisors 
    of 28 would be 1 + 2 + 4 + 7 + 14 = 28, which means that 28 is a perfect 
    number. 

    A number n is called deficient if the sum of its proper divisors is less 
    than n and it is called abundant if this sum exceeds n. 

    As 12 is the smallest abundant number, 1 + 2 + 3 + 4 + 6 = 16, the 
    smallest number that can be written as the sum of two abundant numbers 
    is 24. By mathematical analysis, it can be shown that all integers 
    greater than 28123 can be written as the sum of two abundant numbers. 
    However, this upper limit cannot be reduced any further by analysis even 
    though it is known that the greatest number that cannot be expressed as 
    the sum of two abundant numbers is less than this limit. 

    Find the sum of all the positive integers which cannot be written as the 
    sum of two abundant numbers. 
    """

      
    # Range
    N = range(12,28123)
    
    # Set A = Abundant numbers    
    A = [a for a in N if sum(Divisors(a)) > a]
    A = set(A)

    # Integers not a sum of two abundant numbers
    result = []
    for n in xrange(1,28123 + 1):
        for a in A:
            if (n-a) > 0 and (n-a) in A:
                break
        else:
            result.append(n)
            

    ans = sum(result)

    print "Answer for Problem 23 = %s " % (ans,)





if __name__ == "__main__":
    t = Timer(setup='from __main__ import Problem', stmt='Problem()').timeit(1)
    print "Execution time = %0.3f seconds" %(t,)
